<?php

/**
* @desc Абстрактный класс сохранения данных субъекта 
*/
abstract class User_Backend_Strategy_Abstract extends Kernel_Action_Form_Simple 
{
    
    /**
    * id субъекта безопасности
    */
    protected $_subject_id;
    
    /**
     * Таблица, в которой хранится редактируемый элемент.
     *
     * @var string
     */
    protected $_table = 'user_user';
    
    /**
    * Таблица субъекта безопасности, в которой хранится редактируемый элемент.
    * 
    * @param string
    */
    protected $_table_add = 'system_subject';
    
    /**
    * Пришедшие значения
    * 
    * @param array
    */
    protected $_values = array();
    
    /**
    * @desc Достаем id и пришедшие значения
    * 
    */
    public function __construct($values) 
    {
        $this->_values = $values;
        $this->id = $this->_values['id'];
        array_splice($this->_values, -1, 1);
    }
    
    /**
     * Обновляет существующую запись.
     *
     */
    protected function _update() 
    {
        // обновляем имя и роль
        database::update(
            $this->_table, 
            array_extract($this->_getValues(), array('name', 'role')), 
            array('id' => $this->id)
        );
        
        // обновляем email
        $subject_data = User_Utils::getSystemSubjectData($this->id);
        database::update(
            $this->_table_add, 
            array_extract($this->_values, array('email')), 
            array('id' => $subject_data['id'])
        );
    }
    
    /**
     * Добавляет новую запись.
     *
     */
    protected function _insert() 
    {
        // добавляем объект как субъект безопасности
        $this->_subject_id = database::insert(
            $this->_table_add, 
            array('password' => md5($this->_values['password1']), 'email' => $this->_values['email'])
        );
        
        // добавляем имя и роль объекта
        database::insert(
            $this->_table, 
            array_extract($this->_values, array('name', 'role')) + array('subject_id' => $this->_subject_id)
        );
    }
    
}